package ch.mailbox;

import ch.exception.ObjectNotFoundException;
import ch.exception.UserNotFoundException;


/** Classe per la gestione degli utenti, derivata da <b>PersistentObject</b>.
 *
 * @author Neil Otupacca - May 21 2011
 *
 */
public class User extends PersistentObject {

	@Persistent
	private String firstName;
	@Persistent
	private String lastName;
	@Persistent
	@AutoDefaultReadOnly
	private String registrationDate;
	@Persistent
	private String password;
	@Persistent(name="enabled")
	private boolean userEnabled;

	/** Istanzia un oggetto User inizializzato con indirizzo email, nome,
	 * cognome e password dell'utente.
	 *
	 * @param emailAddr - indirizzo email.
	 * @param firstName - nome.
	 * @param lastName - cognome.
	 * @param password - password di accesso.
	 * @param userEnabled - abilitazione dell'utente.
	 */
	public User(String emailAddr, String firstName, String lastName,
				String password, boolean userEnabled) {
		super("users");
		this.id = 0;
		this.emailAddr = emailAddr;
		this.firstName = firstName;
		this.lastName = lastName;
		this.registrationDate = "";
		this.password = password;
		this.userEnabled = userEnabled;
	}

	/** Constructor protetto utilizzato internamente da <b>newInstance()</b>
	 * nel meethod <b>getPersistentObjectList()</b>.
	 */
	protected User() {
		this("", "", "", "", true);
	}

	/** Crea un oggetto <b>User</b> caricandolo dal database, l'utente è
	 * specificato da <b>emailAddr</b>.
	 *
	 * @param emailAddr - indirizzo email che identifica l'utente.
	 * @return il nuovo User.
	 */
	public static User getUser(String emailAddr) {
		User user = new User(emailAddr, "", "", "", true);

		try {
			user.getPersistentObject(false);  // Carica l'utente dal database
		} catch (ObjectNotFoundException e) {
			throw new UserNotFoundException();
		}

		return(user);
	}

	/** Aggiungi l'utente nel database, l'utente non deve avere un indirizzo
	 * email già utilizzato da un altro utente.
	 *
	 * @return identificatore univoco dell'utente.
	 */
	@Override
	public int add() {
		return(super.add());
	}

	/** Elimina l'utente dal database.
	 *
	 * @return numero di utenti cancellati (0 - 1).
	 */
	@Override
	public int delete() {
		return(super.delete());
	}

	/** Modifica l'indirizzo email dell'utente.
	 * 
	 * @param emailAddr - indirizzo email dell'utente.
	 */
	public void setEmailAddress(String emailAddr) {
		this.emailAddr = emailAddr;
		update();
	}

	/** Ritorna il nome dell'utente.
	 *
	 * @return nome.
	 */
	public String getFirstName() {
		return(firstName);
	}

	/** Modifica il nome dell'utente.
	 *
	 * @param firstName - nome dell'utente.
	 */
	public void setFirstName(String firstName) {
		this.firstName = firstName;
		update();
	}

	/** Ritorna il cognome dell'utente.
	 *
	 * @return cognome.
	 */
	public String getLastName() {
		return(lastName);
	}

	/** Modifica il cognome dell'utente.
	 *
	 * @param lastName - cognome dell'utente.
	 */
	public void setLastName(String lastName) {
		this.lastName = lastName;
		update();
	}

	/** Ritorna la stringa della data e ora di registrazione dell'utente,
	 * formato stringa MySQL (<i>YYYY-MM-DD hh:mm:ss</i>).
	 *
	 * @return data e ora di registrazione.
	 */
	public String getRegistrationDate() {
		return(registrationDate);
	}

	/** Ritorna la password dell'utente.
	 *
	 * @return password.
	 */
	public String getPassword() {
		return(password);
	}

	/** Modifica la password dell'utente.
	 * 
	 * @param password - password dell'utente.
	 */
	public void setPassword(String password) {
		this.password = password;
		update();
	}

	/** Ritorna lo stato di abilitazione dell'account dell'utente.
	 *
	 * @return stato di abilitazione.
	 */
	public boolean getEnabled() {
		return(userEnabled);
	}

	/** Imposta lo stato di abilitazione dell'account dell'utente.
	 *
	 * @param userEnabled - flag di abilitazione.
	 */
	public void setEnabed(boolean userEnabled) {
		this.userEnabled = userEnabled;
		update();
	}

	/** Ritorna il messaggio identificato da <b>id</b>.
	 *
	 * @param id - identificatore univoco del messaggio.
	 * @return messaggio.
	 */
	public Message getMessage(int id) {
		return(Message.getMessage(this, id));
	}

	/** Aggiungi un messaggio per l'utente.
	 *
	 * @param message - stringa del messaggio.
	 * @return messaggio.
	 */
	public Message addMessage(String message) {
		Message msg = new Message(this, message, 0, true);
		msg.add();  // Aggiungi il messaggio nel database
		return(msg);
	}

	/** Ritorna un oggetto <b>IteratorUser</b> che itera tutti gli utenti
	 * registrati.
	 *
	 * @return iteratore <b>IteratorUser</b>.
	 */
	public static IteratorUser getUserIterator() {
		return(new IteratorUser(new User()));
	}

	/** Ritorna un oggetto <b>IteratorMessage</b> che itera tutti i messaggi
	 * dell'utente.
	 *
	 * @return iteratore <b>IteratorMessage</b>.
	 */
	public IteratorMessage getMessageIterator() {
		return(new IteratorMessage(this));
	}
}
